﻿using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Biciq.Datos;
using System.Linq;
using System.ServiceModel.DomainServices.Client.ApplicationServices;
using Biciq.Silverlight.UI.Clases;
using System.Collections.ObjectModel;

namespace Biciq.Silverlight.UI
{
    public class PrincipalVistaModelo:VistaModeloBase
    {
        #region Campos
        private Visibility _logueado;
        private Visibility _deslogueado;
        private string _fecha;
        private Usuario _usuarioLogueado;
        private LoginVistaModelo _loginVistaModelo;
        private LoginVista _loginVista;
        private ObservableCollection<Arbol> _menuSistema;
        private string _pathActual;
        
      
        #endregion

        #region Propiedades

        /// <summary>
        /// Path actual
        /// </summary>
        public string PathActual
        {
            get
            {
                return _pathActual;
            }
            set
            {
                if (_pathActual != value)
                {
                    _pathActual = value;
                    RaisePropertyChanged("PathActual");
                }
            }
        }

        /// <summary>
        /// Menu del Sistem
        /// </summary>
        public ObservableCollection<Arbol> MenuSistema
        {
            get { return _menuSistema; }
            set
            { 
                _menuSistema = value;
                RaisePropertyChanged("MenuSistema");
            }
        }

        /// <summary>
        /// Usuario Logueado al Sistema
        /// </summary>
        public Usuario UsuarioLogueado
        {
            get { return _usuarioLogueado; }
            set
            {
                _usuarioLogueado = value;
                RaisePropertyChanged("UsuarioLogueado");
            }
        }

         /// <summary>
        /// Logueado en el sistema
        /// </summary>
        public Visibility Logueado
        {
            get { return _logueado; }
            set 
            {
                _logueado = value;
                RaisePropertyChanged("Logueado");
            }
        }

        /// <summary>
        /// Deslogueado en el sistema
        /// </summary>
        public Visibility Deslogueado
        {
            get { return _deslogueado; }
            set
            { 
                _deslogueado = value;
                RaisePropertyChanged("Deslogueado");
            }
        }
        /// <summary>
        /// Fecha del Sistema
        /// </summary>
        public string Fecha
        {
            get { return _fecha; }
            set 
            {
                _fecha = value;
                RaisePropertyChanged("Fecha");
            }
        }

        /// <summary>
        /// Comando que se dispara para cerrar la sesión
        /// </summary>
        public RelayCommand ComandoCerrarSesion
        {
            get
            {
                if (_comandoCerrarSesion == null)
                {
                    _comandoCerrarSesion = new RelayCommand
                    (
                        p => Logout()
                    );
                }
                return _comandoCerrarSesion;
            }
        }

        /// <summary>
        /// Comando que se dispara para Loguearse.
        /// </summary>
        public RelayCommand ComandoLogin
        {
            get
            {
                if (_comandoLogin == null)
                {
                    _comandoLogin = new RelayCommand
                    (
                        p => AbrirLogin()
                    );
                }
                return _comandoLogin;
            }
        }

        #endregion

        #region Constructores
        public PrincipalVistaModelo()
        {
            _fecha = DateTime.Now.ToString("dd/MM/yyyy");
            Deslogueado = Visibility.Visible;
            Logueado = Visibility.Collapsed;
            
        }
        #endregion

        #region Comandos
        private RelayCommand _comandoCerrarSesion;
        private RelayCommand _comandoLogin;	 
        #endregion

        #region Métodos Privados

        public void Logout()
        {

            LogoutOperation LogoutOp = WebContext.Current.Authentication.Logout(true);
            LogoutOp.Completed += delegate
            {
                CerrarSesion();



            };
        }

        private void CerrarSesion()
        {
            //SeguridadContexto.Load(SeguridadContexto.GetAccesoUsuarioByIdQuery(CacheCliente.Instance.SessionId)).Completed += delegate
            //{
            //    var _accesoUsuario = SeguridadContexto.AccesoUsuarios.FirstOrDefault();
            //    _accesoUsuario.HoraSalida = new TimeSpan(DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second);
            //    SeguridadContexto.SubmitChanges().Completed += delegate
            //    {
                    var uri = new Uri(ConfigurationManager.AppSettings["WebSite"].ToString());
                    System.Windows.Browser.HtmlPage.Window.Navigate(uri);
            //    };

            //};
        }

        public void AbrirLogin()
        {
            if (!WebContext.Current.Authentication.User.Identity.IsAuthenticated)
            {
                _loginVista = new LoginVista();
                _loginVistaModelo = new LoginVistaModelo();
                _loginVista.DataContext = _loginVistaModelo;

                _loginVistaModelo.EventoCerrarLogin += delegate
                {
                    if (_loginVistaModelo.IsDirty)
                    {
                       UsuarioLogueado = CacheCliente.UsuarioLogueado;
                       Logueado = Visibility.Visible;
                       Deslogueado = Visibility.Collapsed;
                       ArmarMenuPrimerNivel();
                    }

                    _loginVista.Close();
                };
                
                _loginVista.Show();
                
            }
        }
      

        private void ArmarMenuPrimerNivel()
        {

            MenuSistema = new ObservableCollection<Arbol>();
            
            foreach (var item in UsuarioLogueado.Rol.Accesoes.Where(a=>a.Recurso.idPadre=="0" && a.Recurso.tipo=="P" ))
            {
                Arbol itemMenu = new Arbol();
                itemMenu.Descripcion = item.Recurso.descripcion;
                itemMenu.Pagina = item.Recurso.link;
                itemMenu.Tipo = item.Recurso.tipo;
                itemMenu.IdPadre = item.Recurso.idPadre;
                MenuSistema.Add(itemMenu);
                itemMenu.ArbolHijo = new ObservableCollection<Arbol>();

                ArmarMenuSegundoNivel(item, itemMenu);
            }
        }

        private void ArmarMenuSegundoNivel(Acceso recurso, Arbol menu)
        {
            var hijos = UsuarioLogueado.Rol.Accesoes.Where(r => r.Recurso.idPadre == recurso.Recurso.id && r.Recurso.tipo == "H").ToList();
            if (hijos != null && hijos.Count > 0)
            {

                foreach (var item in hijos)
                {
                    Arbol itemMenu = new Arbol();
                    itemMenu.Id = item.Recurso.id;
                    itemMenu.Descripcion = item.Recurso.descripcion;
                    itemMenu.Pagina = item.Recurso.link;
                    itemMenu.Tipo = item.Recurso.tipo;
                    itemMenu.ArbolHijo = new ObservableCollection<Arbol>();
                    itemMenu.IdPadre = item.Recurso.idPadre;
                    menu.ArbolHijo.Add(itemMenu);
                    ArmarMenuSegundoNivel(item, itemMenu);
                }

            }
        }

        #endregion
    }
}
